package com.lzs.collection.Set;

import java.util.HashSet;
import java.util.Objects;

public class HashSet01 {
    @SuppressWarnings("{all}")
    public static void main(String[] args) {
        HashSet<Object> set = new HashSet<>();
        System.out.println(set.add("john"));
        System.out.println(set.add("lucy"));
        System.out.println(set.add("john"));
        System.out.println(set.add("jack"));
        System.out.println(set.add("rose"));
        set.remove("john");
        System.out.println(set);
        //add方法的底层机制? 为什么可以加入两个对象？
        /*
        * Haset的底层是HashMap；主要依赖以下两个方法
        * 1、hashCode()计算哈希值：确定元素在哈希表的位置；
        * 2、equals()比较内容；如果哈希冲突，在通过equals比较对象是否相同，比较的是内存地址
        * 而Dog类并未重写这两个方法，因此默认为了Object方法，所以尽管Dog对象的Tom字段相同，但是他们的内存地址是不同的。
        * 那如何让HashSet识别相同内容的Dog对象呢?
        * 在Dog类中重写hashCode和equals方法，使其基于name字段判断唯一性
        *
        * */
        System.out.println(set.add(new Dog("Tom")));
        System.out.println(set.add(new Dog("Tom")));//ture
        System.out.println(set.add(new String("lzs")));
        System.out.println(set.add(new String("lzs")));//false
    }
}

class Dog {
    private String name;

    public Dog(String name) {

        this.name = name;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Dog dog = (Dog) o;
        return Objects.equals(name, dog.name);
    }
    @Override
    public int hashCode() {
        return Objects.hash();
    }
    @Override
    public String toString() {
        return "Dog [name=" + name + "]";
    }
}